<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<!-- 
	Copyright (C) 2007, 2008, 2009, 2010, 2011. PARP Research Group.
	<http://perception.inf.um.es>
	University of Murcia, Spain.

	This file is part of the QVision library.

	QVision is free software: you can redistribute it and/or modify
	it under the terms of the GNU Lesser General Public License as
	published by the Free Software Foundation, version 3 of the License.

	QVision is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU Lesser General Public License for more details.

	You should have received a copy of the GNU Lesser General Public
	License along with QVision. If not, see <http://www.gnu.org/licenses/>.
-->

<html><head><meta http-equiv="content-Type" content="text/html;charset=UTF-8">
<title>QVision: Qt&#39;s Image, Video and Computer Vision Library</title>
<meta name="title" content="QVision" />
<meta name="dc.title" content="QVision" />
<meta name="url" content="http://perception.inf.um.es/QVision" />
<meta name="author" content="PARP Research Group - http://perception.inf.um.es" />
<meta name="revisit-after" content="30 DAYS"/>
<meta name="robots" content="index,follow"/>
<meta name="classification" content="*">
<meta name="rating" content="Safe For Kids">
<meta name="distribution" content="GLOBAL"/>
<meta name="description" content="Qt's Image, Video and Computer Vision Library"/>
<meta name="page-topic" content="Computer Vision research and prototype programming"/>
<meta name="geo.country" content="ES" />

<!--
Keywords:
By license:		open source, gnu, lgpl, gpl, free
By theme:		computer vision, image processing, robotics, programming, source, development
By usage:		library, toolkit, framework, prototype, application
By programming specs:	object oriented, c++, block programming, reusability, gui, graphical, parallel computing, high performance, GPU, prototyping
Interoperability with:	Qt, GSL, GNU Scientific library, OpenCV, CGAL, QWT, CUDA, mplayer, IPP, Intel Image Performance Primitives, blas, lapack
Functionallity:		image features, matrix algebra, projective geometry, mser, function minimization, function optimization, canny operator, harris operator, corner detection, performance evaluation, cpu usage, graphical interface
Main data-types:	matrix, vector, tensor, quaternion, image, polyline
Video sources:		webcam, camera, stream
Devices:		embedded, desktop computer, laptop, mini-laptop
Authors:		PARP research group. University of Murcia, Spain.
-->

<meta name="keywords" content="augmented reality, sfm, structure from motion, open source, gnu, lgpl, gpl, free, computer vision, image processing, robotics, programming, source, development, library, toolkit, framework, prototype, application, object oriented, c++, block programming, reusability, gui, graphical, parallel computing, high performance, GPU, prototyping, Qt, GSL, GNU Scientific library, OpenCV, CGAL, QWT, CUDA, mplayer, IPP, Intel Image Performance Primitives, blas, lapack, image features, matrix algebra, projective geometry, mser, function minimization, function optimization, canny operator, harris operator, corner detection, performance evaluation, cpu usage, graphical interface, matrix, vector, tensor, quaternion, image, polyline, webcam, camera, stream, embedded, desktop computer, laptop, mini-laptop, University of Murcia, Spain, PARP research group, vision por computador"/>
<meta http-equiv="keywords" content="augmented reality, sfm, structure from motion, open source, gnu, lgpl, gpl, free, computer vision, image processing, robotics, programming, source, development, library, toolkit, framework, prototype, application, object oriented, c++, block programming, reusability, gui, graphical, parallel computing, high performance, GPU, prototyping, Qt, GSL, GNU Scientific library, OpenCV, CGAL, QWT, CUDA, mplayer, IPP, Intel Image Performance Primitives, blas, lapack, image features, matrix algebra, projective geometry, mser, function minimization, function optimization, canny operator, harris operator, corner detection, performance evaluation, cpu usage, graphical interface, matrix, vector, tensor, quaternion, image, polyline, webcam, camera, stream, embedded, desktop computer, laptop, mini-laptop, University of Murcia, Spain, PARP research group, vision por computador"/>
<meta http-equiv="pragma" content="no-cache"/>
<meta http-equiv="title" content="QVision"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="tabs.css" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="favicon.ico" />
</head><body>

<table width="100%"><tr>
	<td><a href="http://perception.inf.um.es/"><img src="parp.png" border="0" /> <big>PARP Research Group</big></a></td>
	<td align="right"><a href="http://www.um.es/"><big>Universidad de Murcia</big> <img src="um.png" border="0" /></a></td>
</tr></table>

<hr /><br />

<table width="95%" align="center"><tr><td>

<!-- Generated by Doxygen 1.6.3 -->
<script type="text/javascript"><!--
var searchBox = new SearchBox("searchBox", "search",false,'Search');
--></script>
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
          <form id="FSearchBox" action="search.php" method="get">
            <img id="MSearchSelect" src="search/search.png" alt=""/>
            <input type="text" id="MSearchField" name="query" value="Search" size="20" accesskey="S" 
                   onfocus="searchBox.OnSearchFieldFocus(true)" 
                   onblur="searchBox.OnSearchFieldFocus(false)"/>
          </form>
        </div>
      </li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
    </ul>
  </div>
<h1>src/qvblockprogramming/qvguiblocks/qvplot.cpp</h1><a href="qvplot_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> *      Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012. PARP Research Group.</span>
<a name="l00003"></a>00003 <span class="comment"> *      &lt;http://perception.inf.um.es&gt;</span>
<a name="l00004"></a>00004 <span class="comment"> *      University of Murcia, Spain.</span>
<a name="l00005"></a>00005 <span class="comment"> *</span>
<a name="l00006"></a>00006 <span class="comment"> *      This file is part of the QVision library.</span>
<a name="l00007"></a>00007 <span class="comment"> *</span>
<a name="l00008"></a>00008 <span class="comment"> *      QVision is free software: you can redistribute it and/or modify</span>
<a name="l00009"></a>00009 <span class="comment"> *      it under the terms of the GNU Lesser General Public License as</span>
<a name="l00010"></a>00010 <span class="comment"> *      published by the Free Software Foundation, version 3 of the License.</span>
<a name="l00011"></a>00011 <span class="comment"> *</span>
<a name="l00012"></a>00012 <span class="comment"> *      QVision is distributed in the hope that it will be useful,</span>
<a name="l00013"></a>00013 <span class="comment"> *      but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00014"></a>00014 <span class="comment"> *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<a name="l00015"></a>00015 <span class="comment"> *      GNU Lesser General Public License for more details.</span>
<a name="l00016"></a>00016 <span class="comment"> *</span>
<a name="l00017"></a>00017 <span class="comment"> *      You should have received a copy of the GNU Lesser General Public</span>
<a name="l00018"></a>00018 <span class="comment"> *      License along with QVision. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
<a name="l00019"></a>00019 <span class="comment"> */</span>
<a name="l00020"></a>00020 
<a name="l00024"></a>00024 
<a name="l00025"></a>00025 <span class="preprocessor">#include &quot;<a class="code" href="qvplot_8h.html" title="File from the QVision library.">qvplot.h</a>&quot;</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include &lt;qwt_plot_layout.h&gt;</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include &lt;qwt_scale_draw.h&gt;</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include &lt;qwt_scale_widget.h&gt;</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include &lt;qwt_legend.h&gt;</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include &lt;qwt_legend_item.h&gt;</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include &lt;qwt_plot_canvas.h&gt;</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include &lt;qpainter.h&gt;</span>
<a name="l00033"></a>00033 
<a name="l00034"></a>00034 <span class="comment">/*QColor QVPlot::colors[] = {</span>
<a name="l00035"></a>00035 <span class="comment">        Qt::red,</span>
<a name="l00036"></a>00036 <span class="comment">        Qt::green,</span>
<a name="l00037"></a>00037 <span class="comment">        Qt::blue,</span>
<a name="l00038"></a>00038 <span class="comment">        Qt::cyan,</span>
<a name="l00039"></a>00039 <span class="comment">        Qt::magenta,</span>
<a name="l00040"></a>00040 <span class="comment">        Qt::darkRed,</span>
<a name="l00041"></a>00041 <span class="comment">        Qt::darkGreen,</span>
<a name="l00042"></a>00042 <span class="comment">        Qt::darkBlue,</span>
<a name="l00043"></a>00043 <span class="comment">        Qt::darkCyan,</span>
<a name="l00044"></a>00044 <span class="comment">        Qt::darkMagenta</span>
<a name="l00045"></a>00045 <span class="comment">        };*/</span>
<a name="l00046"></a>00046 
<a name="l00048"></a>00048 <span class="comment">// auxiliar classes functionality</span>
<a name="l00049"></a>00049 QVPlot::PieMarker::PieMarker(<a class="code" href="classQVPlot.html" title="Class for plot block&amp;#39;s graphs.">QVPlot</a> *plot): qvplot(plot)
<a name="l00050"></a>00050     {
<a name="l00051"></a>00051     setZ(1000);
<a name="l00052"></a>00052     setRenderHint(QwtPlotItem::RenderAntialiased, <span class="keyword">true</span>);
<a name="l00053"></a>00053     }
<a name="l00054"></a>00054 
<a name="l00055"></a>00055 <span class="keywordtype">int</span> QVPlot::PieMarker::rtti()<span class="keyword"> const</span>
<a name="l00056"></a>00056 <span class="keyword">    </span>{
<a name="l00057"></a>00057     <span class="keywordflow">return</span> QwtPlotItem::Rtti_PlotUserItem;
<a name="l00058"></a>00058     }
<a name="l00059"></a>00059 
<a name="l00060"></a>00060 <span class="keywordtype">void</span> QVPlot::PieMarker::draw(QPainter *p, <span class="keyword">const</span> QwtScaleMap &amp;, <span class="keyword">const</span> QwtScaleMap &amp;, <span class="keyword">const</span> QRect &amp;rect)<span class="keyword"> const</span>
<a name="l00061"></a>00061 <span class="keyword">    </span>{
<a name="l00062"></a>00062     <span class="keyword">const</span> <span class="keywordtype">int</span> margin = 5;
<a name="l00063"></a>00063     <span class="keywordtype">int</span> diameter = ( (rect.height() &gt; rect.width()) ? rect.width(): rect.height() ) / 4;
<a name="l00064"></a>00064 
<a name="l00065"></a>00065     QRect pieRect;
<a name="l00066"></a>00066     pieRect.setX(rect.right() - margin - diameter);
<a name="l00067"></a>00067     pieRect.setY(rect.top() + margin);
<a name="l00068"></a>00068 
<a name="l00069"></a>00069     pieRect.setHeight(diameter);
<a name="l00070"></a>00070     pieRect.setWidth(diameter);
<a name="l00071"></a>00071 
<a name="l00072"></a>00072     <span class="keywordtype">int</span> angle = (int)(5760 * 0.75);
<a name="l00073"></a>00073 
<a name="l00074"></a>00074     <span class="keywordtype">double</span> sum = 0;
<a name="l00075"></a>00075     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; qvplot-&gt;linkCont.size(); i++)
<a name="l00076"></a>00076         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j &lt; qvplot-&gt;linkCont[i].properties.size(); j++)
<a name="l00077"></a>00077             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> k = 0; k &lt; qvplot-&gt;linkCont[i].properties[j].curves.size(); k++)
<a name="l00078"></a>00078                 <span class="keywordflow">if</span> (qvplot-&gt;linkCont[i].properties[j].curves[k].plot-&gt;style() != QwtPlotCurve::NoCurve)
<a name="l00079"></a>00079                     sum += qvplot-&gt;linkCont[i].properties[j].curves[k].history[MAX_HISTORY - 1];
<a name="l00080"></a>00080 
<a name="l00081"></a>00081 
<a name="l00082"></a>00082     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; qvplot-&gt;linkCont.size(); i++)
<a name="l00083"></a>00083         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j &lt; qvplot-&gt;linkCont[i].properties.size(); j++)
<a name="l00084"></a>00084             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> k = 0; k &lt; qvplot-&gt;linkCont[i].properties[j].curves.size(); k++)
<a name="l00085"></a>00085                 {
<a name="l00086"></a>00086                 <span class="keyword">const</span> QwtPlotCurve *curve = qvplot-&gt;linkCont[i].properties[j].curves[k].plot;
<a name="l00087"></a>00087                 <span class="keywordflow">if</span> ( (curve-&gt;style() != QwtPlotCurve::NoCurve) &amp;&amp; (curve-&gt;dataSize() &gt; 0) )
<a name="l00088"></a>00088                     {
<a name="l00089"></a>00089                     <span class="keyword">const</span> <span class="keywordtype">int</span> value = (int)(5760 * qvplot-&gt;linkCont[i].properties[j].curves[k].history[MAX_HISTORY - 1] / sum);
<a name="l00090"></a>00090                     p-&gt;save();
<a name="l00091"></a>00091                     p-&gt;setBrush(QBrush(curve-&gt;pen().color(), Qt::SolidPattern));
<a name="l00092"></a>00092                     <span class="keywordflow">if</span> ( value != 0 )
<a name="l00093"></a>00093                         p-&gt;drawPie(pieRect, -angle, -value);
<a name="l00094"></a>00094                     p-&gt;restore();
<a name="l00095"></a>00095 
<a name="l00096"></a>00096                     angle += value;
<a name="l00097"></a>00097                     }
<a name="l00098"></a>00098                 }
<a name="l00099"></a>00099     }
<a name="l00100"></a>00100 
<a name="l00102"></a>00102 
<a name="l00103"></a>00103 QVPlot::QVPlot(<span class="keyword">const</span> QString name, <span class="keywordtype">bool</span> decorations, <span class="keywordtype">bool</span> havePie, <span class="keywordtype">bool</span> brush, <span class="keywordtype">bool</span> _autoShow, <span class="keywordtype">bool</span> time, <span class="keywordtype">int</span> step, QWidget *parent): QwtPlot(parent),
<a name="l00104"></a>00104     <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a>(name), byTime(time), iterationIndex(1), decorations(decorations), hPie(havePie), doBrush(brush), nStep(step), initied(false),
<a name="l00105"></a>00105     autoShow(_autoShow), timer(0), haveCurves(FALSE), activeBlocks(0), usedColors(0)
<a name="l00106"></a>00106     {
<a name="l00107"></a>00107     qDebug() &lt;&lt; <span class="stringliteral">&quot;QVPlot::QVPlot()&quot;</span>;
<a name="l00108"></a>00108     <span class="keywordflow">if</span> (qvApp == NULL)
<a name="l00109"></a>00109         {
<a name="l00110"></a>00110         QString str = <span class="stringliteral">&quot;QVPlot::QVPlot(): the QVPlot cannot be created before the QVApplication instance. Aborting now.&quot;</span>;
<a name="l00111"></a>00111         std::cerr &lt;&lt; qPrintable(str) &lt;&lt; std::endl;
<a name="l00112"></a>00112         exit(1);
<a name="l00113"></a>00113         }
<a name="l00114"></a>00114     <span class="comment">// if its a --help call, do nothing</span>
<a name="l00115"></a>00115     <span class="keywordflow">if</span> (qvApp-&gt;forHelp()) <span class="keywordflow">return</span>;
<a name="l00116"></a>00116     <span class="keywordflow">else</span> QwtPlot(parent);
<a name="l00117"></a>00117 
<a name="l00118"></a>00118 
<a name="l00119"></a>00119     setWindowTitle(<span class="stringliteral">&quot;Plot for &quot;</span> + getName());
<a name="l00120"></a>00120     resize(400,200);
<a name="l00121"></a>00121     setAutoReplot(<span class="keyword">false</span>);
<a name="l00122"></a>00122 
<a name="l00123"></a>00123     <span class="keywordflow">for</span> ( <span class="keywordtype">int</span> i = 0; i &lt; MAX_HISTORY; i++ ) timeData[i] = i;
<a name="l00124"></a>00124 
<a name="l00125"></a>00125     plotLayout()-&gt;setAlignCanvasToScales(<span class="keyword">true</span>);
<a name="l00126"></a>00126 
<a name="l00127"></a>00127     <span class="keywordflow">if</span> (decorations)
<a name="l00128"></a>00128         {
<a name="l00129"></a>00129         QwtLegend *legend = <span class="keyword">new</span> QwtLegend;
<a name="l00130"></a>00130         legend-&gt;setItemMode(QwtLegend::CheckableItem);
<a name="l00131"></a>00131         insertLegend(legend, QwtPlot::RightLegend);
<a name="l00132"></a>00132         }
<a name="l00133"></a>00133     <span class="keywordflow">else</span>
<a name="l00134"></a>00134         {
<a name="l00135"></a>00135         enableAxis(0,<span class="keyword">false</span>);
<a name="l00136"></a>00136         enableAxis(1,<span class="keyword">false</span>);
<a name="l00137"></a>00137         enableAxis(2,<span class="keyword">false</span>);
<a name="l00138"></a>00138         }
<a name="l00139"></a>00139 
<a name="l00140"></a>00140     <span class="keyword">class </span>TimeScaleDraw: <span class="keyword">public</span> QwtScaleDraw
<a name="l00141"></a>00141         {
<a name="l00142"></a>00142         <span class="keyword">public</span>:
<a name="l00143"></a>00143             TimeScaleDraw(<span class="keyword">const</span> <span class="keywordtype">int</span> stp): baseTime(), step(stp) { }
<a name="l00144"></a>00144             <span class="keyword">virtual</span> QwtText label(<span class="keywordtype">double</span> v)<span class="keyword"> const </span>{     <span class="keywordflow">return</span> baseTime.addSecs( (<span class="keywordtype">int</span>)((v-MAX_HISTORY)*step/100)).toString(); }
<a name="l00145"></a>00145         <span class="keyword">private</span>:
<a name="l00146"></a>00146             QTime baseTime;
<a name="l00147"></a>00147             <span class="keywordtype">int</span> step;
<a name="l00148"></a>00148         };
<a name="l00149"></a>00149     <span class="keyword">class </span>IterScaleDraw: <span class="keyword">public</span> QwtScaleDraw
<a name="l00150"></a>00150         {
<a name="l00151"></a>00151         <span class="keyword">public</span>:
<a name="l00152"></a>00152             IterScaleDraw(<span class="keyword">const</span> <span class="keywordtype">int</span> stp): step(stp) { }
<a name="l00153"></a>00153             <span class="keyword">virtual</span> QwtText label(<span class="keywordtype">double</span> v)<span class="keyword"> const       </span>{ <span class="keywordflow">return</span> QString::number((<span class="keywordtype">int</span>)(v-MAX_HISTORY)*step); }
<a name="l00154"></a>00154         <span class="keyword">private</span>:
<a name="l00155"></a>00155             <span class="keywordtype">int</span> step;
<a name="l00156"></a>00156         };
<a name="l00157"></a>00157     <span class="keywordflow">if</span> (byTime) setAxisScaleDraw(QwtPlot::xBottom, <span class="keyword">new</span> TimeScaleDraw(nStep));
<a name="l00158"></a>00158     <span class="keywordflow">else</span>                setAxisScaleDraw(QwtPlot::xBottom, <span class="keyword">new</span> IterScaleDraw(nStep));
<a name="l00159"></a>00159 
<a name="l00160"></a>00160     setAxisScale(QwtPlot::xBottom, 0, MAX_HISTORY);
<a name="l00161"></a>00161     setAxisLabelRotation(QwtPlot::xBottom, -50.0);
<a name="l00162"></a>00162     setAxisLabelAlignment(QwtPlot::xBottom, Qt::AlignLeft | Qt::AlignBottom);
<a name="l00163"></a>00163 
<a name="l00164"></a>00164     <span class="comment">/* In situations, when there is a label at the most right position of the</span>
<a name="l00165"></a>00165 <span class="comment">    scale, additional space is needed to display the overlapping part</span>
<a name="l00166"></a>00166 <span class="comment">    of the label would be taken by reducing the width of scale and canvas.</span>
<a name="l00167"></a>00167 <span class="comment">    To avoid this &quot;jumping canvas&quot; effect, we add a permanent margin.</span>
<a name="l00168"></a>00168 <span class="comment">    We don&#39;t need to do the same for the left border, because there</span>
<a name="l00169"></a>00169 <span class="comment">    is enough space for the overlapping label below the left scale. */</span>
<a name="l00170"></a>00170 
<a name="l00171"></a>00171     QwtScaleWidget *scaleWidget = axisWidget(QwtPlot::xBottom);
<a name="l00172"></a>00172     <span class="keyword">const</span> <span class="keywordtype">int</span> fmh = QFontMetrics(scaleWidget-&gt;font()).height();
<a name="l00173"></a>00173     scaleWidget-&gt;setMinBorderDist(0, fmh / 2);
<a name="l00174"></a>00174 
<a name="l00175"></a>00175     setAxisTitle(QwtPlot::yLeft, <span class="stringliteral">&quot;Value&quot;</span>);
<a name="l00176"></a>00176     <span class="keywordflow">if</span> (byTime) setAxisTitle(QwtPlot::xBottom, <span class="stringliteral">&quot;Time&quot;</span>);
<a name="l00177"></a>00177     <span class="keywordflow">else</span>                setAxisTitle(QwtPlot::xBottom, <span class="stringliteral">&quot;Iterations&quot;</span>);
<a name="l00178"></a>00178     }
<a name="l00179"></a>00179 
<a name="l00180"></a>00180 QVPlot::~QVPlot()
<a name="l00181"></a>00181 {
<a name="l00182"></a>00182     stop();
<a name="l00184"></a>00184 }
<a name="l00185"></a>00185 
<a name="l00186"></a>00186 <span class="keywordtype">bool</span> QVPlot::linkProperty(QString, <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *, QString, LinkType)
<a name="l00187"></a>00187     {
<a name="l00188"></a>00188         std::cerr &lt;&lt; <span class="stringliteral">&quot;ERROR: QVPlot::linkProperty(): a QVPlot has not output properties to be linked&quot;</span> &lt;&lt; std::endl;
<a name="l00189"></a>00189         <span class="keywordflow">return</span> FALSE;
<a name="l00190"></a>00190     }
<a name="l00191"></a>00191 
<a name="l00192"></a>00192 <span class="keywordtype">bool</span> QVPlot::linkProperty(QString sourcePropertyName, <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> &amp;destinyContainer, QString destinyPropertyName, LinkType linkType)
<a name="l00193"></a>00193     {
<a name="l00194"></a>00194         <span class="keywordflow">return</span> linkProperty(sourcePropertyName, &amp;destinyContainer, destinyPropertyName, linkType);
<a name="l00195"></a>00195     }
<a name="l00196"></a>00196 
<a name="l00197"></a>00197 <span class="keywordtype">bool</span> QVPlot::linkProperty(<a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *, QString, LinkType)
<a name="l00198"></a>00198     {
<a name="l00199"></a>00199         std::cerr &lt;&lt; <span class="stringliteral">&quot;ERROR: QVPlot::linkProperty(): a QVPlot has not output properties to be linked&quot;</span> &lt;&lt; std::endl;
<a name="l00200"></a>00200         <span class="keywordflow">return</span> FALSE;
<a name="l00201"></a>00201     }
<a name="l00202"></a>00202 
<a name="l00203"></a>00203 <span class="keywordtype">bool</span> QVPlot::linkProperty(<a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> &amp;destinyContainer, QString destinyPropertyName, LinkType linkType)
<a name="l00204"></a>00204     {
<a name="l00205"></a>00205         <span class="keywordflow">return</span> linkProperty(&amp;destinyContainer, destinyPropertyName, linkType);
<a name="l00206"></a>00206     }
<a name="l00207"></a>00207 
<a name="l00208"></a>00208 <span class="keywordtype">bool</span> QVPlot::linkProperty(QString, <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *, LinkType)
<a name="l00209"></a>00209     {
<a name="l00210"></a>00210         std::cerr &lt;&lt; <span class="stringliteral">&quot;ERROR: QVPlot::linkProperty(): a QVPlot has not output properties to be linked&quot;</span> &lt;&lt; std::endl;
<a name="l00211"></a>00211         <span class="keywordflow">return</span> FALSE;
<a name="l00212"></a>00212     }
<a name="l00213"></a>00213 
<a name="l00214"></a>00214 <span class="keywordtype">bool</span> QVPlot::linkProperty(QString sourcePropertyName, <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> &amp;destinyContainer, LinkType linkType)
<a name="l00215"></a>00215     {
<a name="l00216"></a>00216         <span class="keywordflow">return</span> linkProperty(sourcePropertyName, &amp;destinyContainer, linkType);
<a name="l00217"></a>00217     }
<a name="l00218"></a>00218 
<a name="l00219"></a>00219 <span class="keywordtype">void</span> QVPlot::linkProperty(<a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *, LinkType)
<a name="l00220"></a>00220     {
<a name="l00221"></a>00221         std::cerr &lt;&lt; <span class="stringliteral">&quot;ERROR: QVPlot::linkProperty(): a QVPlot has not output properties to be linked&quot;</span> &lt;&lt; std::endl;
<a name="l00222"></a>00222     }
<a name="l00223"></a>00223 
<a name="l00224"></a>00224 <span class="keywordtype">void</span> QVPlot::linkProperty(<a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> &amp;container, LinkType linkType)
<a name="l00225"></a>00225     {
<a name="l00226"></a>00226         linkProperty(&amp;container, linkType);
<a name="l00227"></a>00227     }
<a name="l00228"></a>00228 
<a name="l00229"></a>00229 <span class="keywordtype">bool</span> QVPlot::unlinkProperty(QString, <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *, QString)
<a name="l00230"></a>00230     {
<a name="l00231"></a>00231         std::cerr &lt;&lt; <span class="stringliteral">&quot;ERROR: QVPlot::linkProperty(): a QVPlot has not output properties to be unlinked&quot;</span> &lt;&lt; std::endl;
<a name="l00232"></a>00232         <span class="keywordflow">return</span> FALSE;
<a name="l00233"></a>00233     }
<a name="l00234"></a>00234 
<a name="l00235"></a>00235 <span class="keywordtype">bool</span> QVPlot::unlinkProperty(QString origName, <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> &amp;destCont, QString destName)
<a name="l00236"></a>00236     {
<a name="l00237"></a>00237         <span class="keywordflow">return</span> unlinkProperty(origName, &amp;destCont, destName);
<a name="l00238"></a>00238     }
<a name="l00239"></a>00239 
<a name="l00240"></a>00240 <span class="keywordtype">void</span> QVPlot::unlink()
<a name="l00241"></a>00241     {
<a name="l00242"></a>00242         std::cerr &lt;&lt; <span class="stringliteral">&quot;ERROR: QVPlot::linkProperty(): a QVPlot has not output properties to be unlinked&quot;</span> &lt;&lt; std::endl;
<a name="l00243"></a>00243     }
<a name="l00244"></a>00244 
<a name="l00245"></a>00245 <span class="keywordtype">bool</span> QVPlot::linkUnspecifiedInputProperty(<a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *sourceContainer, QString sourcePropName, LinkType linkType)
<a name="l00246"></a>00246     {
<a name="l00247"></a>00247     <span class="keywordflow">if</span> (initied)
<a name="l00248"></a>00248         {
<a name="l00249"></a>00249         std::cerr &lt;&lt; <span class="stringliteral">&quot;Warning: a block can&#39;t be linked before plot was initied.&quot;</span> &lt;&lt; std::endl;
<a name="l00250"></a>00250         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00251"></a>00251         }
<a name="l00252"></a>00252 
<a name="l00253"></a>00253     <span class="keywordflow">if</span> (linkType != AsynchronousLink) {
<a name="l00254"></a>00254         std::cerr &lt;&lt; <span class="stringliteral">&quot;ERROR: QVPlot::linkUnspecifiedInputProperty(): the linkType must be AsynchronousLink, the link will not be done&quot;</span> &lt;&lt; std::endl;
<a name="l00255"></a>00255         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00256"></a>00256     }
<a name="l00257"></a>00257 
<a name="l00258"></a>00258     <a class="code" href="classQVProcessingBlock.html" title="Base class for Block threads.">QVProcessingBlock</a>* block;
<a name="l00259"></a>00259     <span class="keywordflow">if</span>((block = dynamic_cast&lt;QVProcessingBlock*&gt;(sourceContainer)) != NULL)
<a name="l00260"></a>00260         {
<a name="l00261"></a>00261         <span class="keywordtype">bool</span> newBlock = <span class="keyword">false</span>;
<a name="l00262"></a>00262         <span class="keywordflow">if</span> (!pcl_Blocks.contains(block))
<a name="l00263"></a>00263             {
<a name="l00264"></a>00264             pcl_Blocks &lt;&lt; block;
<a name="l00265"></a>00265             <span class="keywordflow">if</span> ( (!byTime) &amp;&amp; (!<a class="code" href="classQVPropertyContainer.html#afc35c0aeca52288aec5a095e139e9c40" title="Check if a group of QVPropertyContainers are synchronously or Sequentialy linked...">QVPropertyContainer::areSynchronized</a>(pcl_Blocks)) )
<a name="l00266"></a>00266                 {
<a name="l00267"></a>00267                 pcl_Blocks.removeLast();
<a name="l00268"></a>00268                 std::cerr &lt;&lt; <span class="stringliteral">&quot;Warning: linked property&#39;s block must be synchronized with previous plot&#39;s linked blocks.&quot;</span> &lt;&lt; std::endl;
<a name="l00269"></a>00269                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00270"></a>00270                 }
<a name="l00271"></a>00271             activeBlocks++;
<a name="l00272"></a>00272             newBlock = <span class="keyword">true</span>;
<a name="l00273"></a>00273             }
<a name="l00274"></a>00274 
<a name="l00275"></a>00275         QString myPropertyName = sourcePropName + QString(<span class="stringliteral">&quot; (%1)&quot;</span>).arg(block-&gt;getId());
<a name="l00276"></a>00276         addPropertyFromQVariant(myPropertyName, inputFlag, block-&gt;getPropertyQVariantValue(sourcePropName), block-&gt;getPropertyInfo(sourcePropName));
<a name="l00277"></a>00277         <span class="keywordtype">bool</span> result = block-&gt;<a class="code" href="classQVPropertyContainer.html#abd2a991c0bc91cee684ff3ffc80825dd" title="Links properties among QVPropertyContainer&amp;#39;s.">linkProperty</a>(sourcePropName, <span class="keyword">this</span>, myPropertyName, QVProcessingBlock::AsynchronousLink);
<a name="l00278"></a>00278 
<a name="l00279"></a>00279         <span class="keywordflow">if</span> (newBlock)
<a name="l00280"></a>00280             {
<a name="l00281"></a>00281             linkCont &lt;&lt; LinkedContainer(block-&gt;getId());
<a name="l00282"></a>00282 
<a name="l00283"></a>00283             <span class="comment">// este tipo de bloqueo pos iteraciones puede retardar al block</span>
<a name="l00284"></a>00284             QObject::connect(block, SIGNAL(endIteration(uint, <span class="keywordtype">int</span>)), <span class="keyword">this</span>, SLOT(update(uint, <span class="keywordtype">int</span>)), Qt::BlockingQueuedConnection);
<a name="l00285"></a>00285             QObject::connect(block, SIGNAL(statusUpdate(<a class="code" href="classQVProcessingBlock.html#a1a629009a666814593cd3f50198b24c5" title="Different states in which a block object can be.">QVProcessingBlock::TBlockStatus</a>)), <span class="keyword">this</span>, SLOT(blockChange(<a class="code" href="classQVProcessingBlock.html#a1a629009a666814593cd3f50198b24c5" title="Different states in which a block object can be.">QVProcessingBlock::TBlockStatus</a>)));
<a name="l00286"></a>00286             }
<a name="l00287"></a>00287 
<a name="l00288"></a>00288         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; linkCont.size(); i++)
<a name="l00289"></a>00289             <span class="keywordflow">if</span> (linkCont[i].<span class="keywordtype">id</span> == block-&gt;getId())
<a name="l00290"></a>00290                 {
<a name="l00291"></a>00291                 linkCont[i].properties.append(Property(myPropertyName));
<a name="l00292"></a>00292                 <span class="keywordflow">break</span>;
<a name="l00293"></a>00293                 }
<a name="l00294"></a>00294 
<a name="l00295"></a>00295         <span class="keywordflow">return</span> result;
<a name="l00296"></a>00296         }
<a name="l00297"></a>00297     <span class="keywordflow">else</span>
<a name="l00298"></a>00298         {
<a name="l00299"></a>00299         std::cerr &lt;&lt; <span class="stringliteral">&quot;ERROR: QVPlot::linkUnspecifiedInputProperty(): the sourceContainer container must be a QVProcessingBlock, the link will not be done&quot;</span> &lt;&lt; std::endl;
<a name="l00300"></a>00300         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00301"></a>00301         }
<a name="l00302"></a>00302     }
<a name="l00303"></a>00303 
<a name="l00304"></a>00304 <span class="keywordtype">bool</span> QVPlot::treatUnlinkInputProperty(QString destPropName, <a class="code" href="classQVPropertyContainer.html" title="Base class for dynamic property container objects.">QVPropertyContainer</a> *sourceCont, QString)
<a name="l00305"></a>00305     {
<a name="l00306"></a>00306     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; linkCont.size(); i++)
<a name="l00307"></a>00307         <span class="keywordflow">if</span> (linkCont[i].<span class="keywordtype">id</span> == sourceCont-&gt;<a class="code" href="classQVPropertyContainer.html#a79e08d0500b8dcd0c15cdadb4e3d9a7e" title="Retrieves identifier uint of the object.">getId</a>())
<a name="l00308"></a>00308             {
<a name="l00309"></a>00309             <span class="keywordtype">int</span> pos = -1;
<a name="l00310"></a>00310             <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; linkCont[i].properties.size(); j++)
<a name="l00311"></a>00311                 <span class="keywordflow">if</span> (linkCont[i].properties[j].name == destPropName)
<a name="l00312"></a>00312                     pos = j;
<a name="l00313"></a>00313 
<a name="l00314"></a>00314             <span class="keywordflow">if</span> (pos &gt;= 0)
<a name="l00315"></a>00315                 {
<a name="l00316"></a>00316                 linkCont[i].properties.removeAt(pos);
<a name="l00317"></a>00317                 }
<a name="l00318"></a>00318 
<a name="l00319"></a>00319             <span class="keywordflow">if</span> (linkCont[i].properties.size() == 0)
<a name="l00320"></a>00320                 {
<a name="l00321"></a>00321                 linkCont.removeAt(i);
<a name="l00322"></a>00322                 pcl_Blocks.removeAll(sourceCont);
<a name="l00323"></a>00323                 activeBlocks--;
<a name="l00324"></a>00324 
<a name="l00325"></a>00325                 <a class="code" href="classQVProcessingBlock.html" title="Base class for Block threads.">QVProcessingBlock</a>* block;
<a name="l00326"></a>00326                 <span class="keywordflow">if</span>((block = dynamic_cast&lt;QVProcessingBlock*&gt;(sourceCont)) != NULL)
<a name="l00327"></a>00327                     {
<a name="l00328"></a>00328                     QObject::disconnect(block, SIGNAL(endIteration(uint, <span class="keywordtype">int</span>)), <span class="keyword">this</span>, SLOT(update(uint, <span class="keywordtype">int</span>)));
<a name="l00329"></a>00329                     QObject::disconnect(block, SIGNAL(statusUpdate(<a class="code" href="classQVProcessingBlock.html#a1a629009a666814593cd3f50198b24c5" title="Different states in which a block object can be.">QVProcessingBlock::TBlockStatus</a>)), <span class="keyword">this</span>, SLOT(blockChange(<a class="code" href="classQVProcessingBlock.html#a1a629009a666814593cd3f50198b24c5" title="Different states in which a block object can be.">QVProcessingBlock::TBlockStatus</a>)));
<a name="l00330"></a>00330                     }
<a name="l00331"></a>00331                 }
<a name="l00332"></a>00332                 <span class="keywordflow">break</span>;
<a name="l00333"></a>00333             }
<a name="l00334"></a>00334 
<a name="l00335"></a>00335     removeProperty(destPropName);
<a name="l00336"></a>00336     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00337"></a>00337     }
<a name="l00338"></a>00338 
<a name="l00339"></a>00339 <span class="keywordtype">void</span> QVPlot::init()
<a name="l00340"></a>00340     {
<a name="l00341"></a>00341     <span class="keywordflow">if</span> (initied)
<a name="l00342"></a>00342         {
<a name="l00343"></a>00343         std::cerr &lt;&lt; <span class="stringliteral">&quot;Warning: a plot can&#39;t be initied more than one time.&quot;</span> &lt;&lt; std::endl;
<a name="l00344"></a>00344         <span class="keywordflow">return</span>;
<a name="l00345"></a>00345         }
<a name="l00346"></a>00346 
<a name="l00347"></a>00347     <span class="keywordflow">if</span> (hPie)
<a name="l00348"></a>00348         {
<a name="l00349"></a>00349         pie = <span class="keyword">new</span> PieMarker(<span class="keyword">this</span>);
<a name="l00350"></a>00350         pie-&gt;attach(<span class="keyword">this</span>);
<a name="l00351"></a>00351         }
<a name="l00352"></a>00352 
<a name="l00353"></a>00353     readInputProperties();
<a name="l00354"></a>00354     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; linkCont.size(); i++)
<a name="l00355"></a>00355         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j &lt; linkCont[i].properties.size(); j++)
<a name="l00356"></a>00356             {
<a name="l00357"></a>00357             <span class="keyword">const</span> QStringList curvNames = getPropertyCurvNames(linkCont[i].properties[j].name);
<a name="l00358"></a>00358 
<a name="l00359"></a>00359             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> k = curvNames.size()-1; k &gt;= 0; k--)
<a name="l00360"></a>00360                 {
<a name="l00361"></a>00361                 QString finalName = curvNames.at(k);
<a name="l00362"></a>00362 
<a name="l00363"></a>00363                 QwtPlotCurve * qwtpc = <span class="keyword">new</span> QwtPlotCurve(finalName);
<a name="l00364"></a>00364                 qwtpc-&gt;setRenderHint(QwtPlotItem::RenderAntialiased);
<a name="l00365"></a>00365                 QColor color = nextColor();
<a name="l00366"></a>00366                 qwtpc-&gt;setPen(color);
<a name="l00367"></a>00367                 <span class="keywordflow">if</span> (doBrush) qwtpc-&gt;setBrush(color);
<a name="l00368"></a>00368                 qwtpc-&gt;setVisible(<span class="keyword">true</span>);
<a name="l00369"></a>00369                 qwtpc-&gt;attach(<span class="keyword">this</span>);
<a name="l00370"></a>00370 
<a name="l00371"></a>00371                 <span class="keywordflow">if</span> (byTime) linkCont[i].properties[j].curves.prepend(Curve(finalName, qwtpc, 1));
<a name="l00372"></a>00372                 <span class="keywordflow">else</span>        linkCont[i].properties[j].curves.prepend(Curve(finalName, qwtpc, linkCont.size()+1));
<a name="l00373"></a>00373                 haveCurves = TRUE;
<a name="l00374"></a>00374                 }
<a name="l00375"></a>00375 
<a name="l00376"></a>00376             <span class="comment">// and conect the legend items chechek signal</span>
<a name="l00377"></a>00377             updateLegendItems();
<a name="l00378"></a>00378             }
<a name="l00379"></a>00379 
<a name="l00380"></a>00380     <span class="keywordflow">if</span> (byTime) timer = startTimer(nStep * 10); <span class="comment">// nStep * 10 ms</span>
<a name="l00381"></a>00381 
<a name="l00382"></a>00382     initied = <span class="keyword">true</span>;
<a name="l00383"></a>00383     }
<a name="l00384"></a>00384 
<a name="l00385"></a>00385 <span class="keywordtype">void</span> QVPlot::stop()
<a name="l00386"></a>00386     {
<a name="l00387"></a>00387     <span class="keywordflow">if</span> (byTime &amp;&amp; initied) killTimer(timer);
<a name="l00388"></a>00388     initied = <span class="keyword">false</span>;
<a name="l00389"></a>00389     }
<a name="l00390"></a>00390 
<a name="l00391"></a>00391 QColor QVPlot::nextColor()
<a name="l00392"></a>00392     {
<a name="l00393"></a>00393     QColor color = qvColors[usedColors % 10];
<a name="l00394"></a>00394     usedColors++;
<a name="l00395"></a>00395     <span class="keywordflow">return</span> color;
<a name="l00396"></a>00396     }
<a name="l00397"></a>00397 
<a name="l00398"></a>00398 <span class="keywordtype">void</span> QVPlot::timerEvent(QTimerEvent *)
<a name="l00399"></a>00399     {
<a name="l00400"></a>00400     <span class="keywordflow">if</span> (!initied)
<a name="l00401"></a>00401         {
<a name="l00402"></a>00402         std::cerr &lt;&lt; <span class="stringliteral">&quot;Warning: a plot can&#39;t be advanced before it was initied.&quot;</span> &lt;&lt; std::endl;
<a name="l00403"></a>00403         <span class="keywordflow">return</span>;
<a name="l00404"></a>00404         }
<a name="l00405"></a>00405 
<a name="l00406"></a>00406     <span class="comment">// if there are data of flags, advance the Plot</span>
<a name="l00407"></a>00407     <span class="keywordflow">if</span> (haveCurves) advancePlot();
<a name="l00408"></a>00408     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; linkCont.size(); i++) linkCont[i].meanItems = 0;
<a name="l00409"></a>00409     }
<a name="l00410"></a>00410 
<a name="l00411"></a>00411 <span class="keywordtype">void</span> QVPlot::blockChange(<a class="code" href="classQVProcessingBlock.html#a1a629009a666814593cd3f50198b24c5" title="Different states in which a block object can be.">QVProcessingBlock::TBlockStatus</a> status)
<a name="l00412"></a>00412     {
<a name="l00413"></a>00413     <span class="keywordflow">if</span> ( (status == <a class="code" href="classQVProcessingBlock.html#a1a629009a666814593cd3f50198b24c5a24d46237cabfd686cbdb35b20b193baa" title="Block is finished. Execution thread ended.">QVProcessingBlock::Finished</a>) &amp;&amp; (activeBlocks &gt; 0) ) activeBlocks--;
<a name="l00414"></a>00414     }
<a name="l00415"></a>00415 
<a name="l00416"></a>00416 <span class="keywordtype">void</span> QVPlot::update(uint <span class="keywordtype">id</span>, <span class="keywordtype">int</span>)
<a name="l00417"></a>00417     {
<a name="l00418"></a>00418     <span class="comment">// First must be initied</span>
<a name="l00419"></a>00419     <span class="keywordflow">if</span> (!initied)
<a name="l00420"></a>00420         {
<a name="l00421"></a>00421         std::cerr &lt;&lt; <span class="stringliteral">&quot;Warning: a plot can&#39;t be advanced before it was initied.&quot;</span> &lt;&lt; std::endl;
<a name="l00422"></a>00422         <span class="keywordflow">return</span>;
<a name="l00423"></a>00423         }
<a name="l00424"></a>00424 
<a name="l00425"></a>00425     <span class="keywordflow">if</span> (byTime)
<a name="l00426"></a>00426         {
<a name="l00427"></a>00427         readInputProperties();
<a name="l00428"></a>00428         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; linkCont.size(); i++)
<a name="l00429"></a>00429             <span class="keywordflow">if</span> (linkCont[i].<span class="keywordtype">id</span> == <span class="keywordtype">id</span>)
<a name="l00430"></a>00430                 {
<a name="l00431"></a>00431                 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j &lt; linkCont[i].properties.size(); j++)
<a name="l00432"></a>00432                     {
<a name="l00433"></a>00433                     insertNewFlags(i, j);
<a name="l00434"></a>00434 
<a name="l00435"></a>00435                     <span class="keyword">const</span> QList&lt;double&gt; values = getPropertyCurvValues(linkCont[i].properties[j].name);
<a name="l00436"></a>00436                     <span class="keywordflow">if</span> (values.size() != linkCont[i].properties[j].curves.size())
<a name="l00437"></a>00437                         {
<a name="l00438"></a>00438                         std::cerr &lt;&lt; <span class="stringliteral">&quot;QVPlot internal error: flags insert.&quot;</span> &lt;&lt; std::endl;
<a name="l00439"></a>00439                         <span class="keywordflow">return</span>;
<a name="l00440"></a>00440                         }
<a name="l00441"></a>00441 
<a name="l00442"></a>00442                     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k &lt; linkCont[i].properties[j].curves.size(); k++)
<a name="l00443"></a>00443                         <span class="keywordflow">if</span> (linkCont[i].meanItems &lt; 1)
<a name="l00444"></a>00444                             linkCont[i].properties[j].curves[k].temp[0] = values[k];
<a name="l00445"></a>00445                         <span class="keywordflow">else</span>
<a name="l00446"></a>00446                             linkCont[i].properties[j].curves[k].temp[0] =
<a name="l00447"></a>00447                             (linkCont[i].properties[j].curves[k].temp[0]*linkCont[i].meanItems+values[k]) / (linkCont[i].meanItems + 1);
<a name="l00448"></a>00448                     linkCont[i].meanItems++;
<a name="l00449"></a>00449                     }
<a name="l00450"></a>00450                 <span class="keywordflow">break</span>;
<a name="l00451"></a>00451                 }
<a name="l00452"></a>00452         }
<a name="l00453"></a>00453     <span class="keywordflow">else</span>
<a name="l00454"></a>00454         {
<a name="l00455"></a>00455         readInputProperties();
<a name="l00456"></a>00456         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; linkCont.size(); i++)
<a name="l00457"></a>00457             <span class="keywordflow">if</span> (linkCont[i].<span class="keywordtype">id</span> == <span class="keywordtype">id</span>)
<a name="l00458"></a>00458                 {
<a name="l00459"></a>00459                 linkCont[i].iter++;
<a name="l00460"></a>00460                 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j &lt; linkCont[i].properties.size(); j++)
<a name="l00461"></a>00461                     {
<a name="l00462"></a>00462                     insertNewFlags(i, j);
<a name="l00463"></a>00463 
<a name="l00464"></a>00464                     <span class="keyword">const</span> QList&lt;double&gt; values = getPropertyCurvValues(linkCont[i].properties[j].name);
<a name="l00465"></a>00465                     <span class="keywordflow">if</span> (values.size() != linkCont[i].properties[j].curves.size())
<a name="l00466"></a>00466                         {
<a name="l00467"></a>00467                         std::cerr &lt;&lt; <span class="stringliteral">&quot;QVPlot internal error: flags insert.&quot;</span> &lt;&lt; std::endl;
<a name="l00468"></a>00468                         <span class="keywordflow">return</span>;
<a name="l00469"></a>00469                         }
<a name="l00470"></a>00470 
<a name="l00471"></a>00471                     <span class="comment">// update block&#39;s properties values for its iteration in the &quot;temp&quot; buffer (add the new value)</span>
<a name="l00472"></a>00472                     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k &lt; linkCont[i].properties[j].curves.size(); k++)
<a name="l00473"></a>00473                         linkCont[i].properties[j].curves[k].temp[(linkCont[i].iter % (linkCont.size()+1))] += values[k];
<a name="l00474"></a>00474                     }
<a name="l00475"></a>00475                 <span class="keywordflow">break</span>;
<a name="l00476"></a>00476                 }
<a name="l00477"></a>00477 
<a name="l00478"></a>00478         <span class="keywordtype">int</span> updateBlocks = 0;
<a name="l00479"></a>00479         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; linkCont.size(); i++)
<a name="l00480"></a>00480             <span class="keywordflow">if</span> (linkCont[i].iter &gt;= iterationIndex) updateBlocks++;
<a name="l00481"></a>00481 
<a name="l00482"></a>00482         <span class="comment">// If has completed the current iteration column</span>
<a name="l00483"></a>00483         <span class="keywordflow">if</span> (updateBlocks &gt;= activeBlocks)
<a name="l00484"></a>00484             {
<a name="l00485"></a>00485             <span class="comment">// If has completed nStep iterations</span>
<a name="l00486"></a>00486             <span class="keywordflow">if</span> ((iterationIndex % nStep) == 0)
<a name="l00487"></a>00487                 {
<a name="l00488"></a>00488                 <span class="comment">// obtain the mean to it</span>
<a name="l00489"></a>00489                 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; linkCont.size(); i++)
<a name="l00490"></a>00490                     {
<a name="l00491"></a>00491                     linkCont[i].meanItems++;
<a name="l00492"></a>00492                     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j &lt; linkCont[i].properties.size(); j++)
<a name="l00493"></a>00493                         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k &lt; linkCont[i].properties[j].curves.size(); k++)
<a name="l00494"></a>00494                             linkCont[i].properties[j].curves[k].temp[(iterationIndex % (linkCont.size()+1))] /= linkCont[i].meanItems;
<a name="l00495"></a>00495                     linkCont[i].meanItems = 0;
<a name="l00496"></a>00496                     }
<a name="l00497"></a>00497 
<a name="l00498"></a>00498                 <span class="comment">// Advance the plot</span>
<a name="l00499"></a>00499                 <span class="keywordflow">if</span> (haveCurves) advancePlot();
<a name="l00500"></a>00500                 }
<a name="l00501"></a>00501             <span class="keywordflow">else</span>
<a name="l00502"></a>00502                 {
<a name="l00503"></a>00503                 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; linkCont.size(); i++)
<a name="l00504"></a>00504                     {
<a name="l00505"></a>00505                     linkCont[i].meanItems++;
<a name="l00506"></a>00506                     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j &lt; linkCont[i].properties.size(); j++)
<a name="l00507"></a>00507                         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k &lt; linkCont[i].properties[j].curves.size(); k++)
<a name="l00508"></a>00508                             linkCont[i].properties[j].curves[k].temp[((iterationIndex+1) % (linkCont.size()+1))] +=
<a name="l00509"></a>00509                             linkCont[i].properties[j].curves[k].temp[(iterationIndex % (linkCont.size()+1))];
<a name="l00510"></a>00510                     }
<a name="l00511"></a>00511                 }
<a name="l00512"></a>00512             <span class="comment">// And reset the column</span>
<a name="l00513"></a>00513             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; linkCont.size(); i++)
<a name="l00514"></a>00514                 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j &lt; linkCont[i].properties.size(); j++)
<a name="l00515"></a>00515                     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k &lt; linkCont[i].properties[j].curves.size(); k++)
<a name="l00516"></a>00516                         linkCont[i].properties[j].curves[k].temp[(iterationIndex % (linkCont.size()+1))] = 0;
<a name="l00517"></a>00517             iterationIndex++;
<a name="l00518"></a>00518             }
<a name="l00519"></a>00519         }
<a name="l00520"></a>00520     }
<a name="l00521"></a>00521 
<a name="l00522"></a>00522 <span class="keywordtype">void</span> QVPlot::insertNewFlags(<span class="keywordtype">int</span> cont, <span class="keywordtype">int</span> prop)
<a name="l00523"></a>00523     {
<a name="l00524"></a>00524     <span class="keyword">const</span> QStringList curvNames = getPropertyCurvNames(linkCont[cont].properties[prop].name);
<a name="l00525"></a>00525     <span class="keywordflow">if</span> ( (linkCont.size() &gt; cont) &amp;&amp; (linkCont[cont].properties.size() &gt; prop) &amp;&amp; (curvNames.size() &gt; linkCont[cont].properties[prop].curves.size()) )
<a name="l00526"></a>00526         {
<a name="l00527"></a>00527         <span class="keyword">const</span> QList&lt;int&gt; curvOrders = getPropertyCurvOrders(linkCont[cont].properties[prop].name);
<a name="l00528"></a>00528         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; curvOrders.size(); i++)
<a name="l00529"></a>00529             <span class="keywordflow">if</span> (curvOrders.at(i) &gt; linkCont[cont].properties[prop].curves.size())
<a name="l00530"></a>00530                 {
<a name="l00531"></a>00531                 QString finalName = curvNames.at(i);
<a name="l00532"></a>00532 
<a name="l00533"></a>00533                 QwtPlotCurve * qwtpc = <span class="keyword">new</span> QwtPlotCurve(finalName);
<a name="l00534"></a>00534                 qwtpc-&gt;setRenderHint(QwtPlotItem::RenderAntialiased);
<a name="l00535"></a>00535                 QColor color = nextColor();
<a name="l00536"></a>00536                 qwtpc-&gt;setPen(color);
<a name="l00537"></a>00537                 <span class="keywordflow">if</span> (doBrush) qwtpc-&gt;setBrush(color);
<a name="l00538"></a>00538                 qwtpc-&gt;setVisible(<span class="keyword">true</span>);
<a name="l00539"></a>00539 
<a name="l00540"></a>00540                 <span class="keywordflow">if</span> (byTime) linkCont[cont].properties[prop].curves.insert(i, Curve(finalName, qwtpc, 1));
<a name="l00541"></a>00541                 <span class="keywordflow">else</span>        linkCont[cont].properties[prop].curves.insert(i, Curve(finalName, qwtpc, linkCont.size()+1));
<a name="l00542"></a>00542                 haveCurves = TRUE;
<a name="l00543"></a>00543                 }
<a name="l00544"></a>00544 
<a name="l00545"></a>00545         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = linkCont.size()-1; i &gt;= 0; i--)
<a name="l00546"></a>00546             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = linkCont[i].properties.size()-1; j &gt;= 0; j--)
<a name="l00547"></a>00547                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = linkCont[i].properties[j].curves.size()-1; k &gt;= 0; k--)
<a name="l00548"></a>00548                     {
<a name="l00549"></a>00549                     linkCont[i].properties[j].curves[k].plot-&gt;detach();
<a name="l00550"></a>00550                     linkCont[i].properties[j].curves[k].plot-&gt;attach(<span class="keyword">this</span>);
<a name="l00551"></a>00551                     }
<a name="l00552"></a>00552 
<a name="l00553"></a>00553         <span class="comment">// and reconect the legend items chechek signal</span>
<a name="l00554"></a>00554         updateLegendItems();
<a name="l00555"></a>00555         }
<a name="l00556"></a>00556     }
<a name="l00557"></a>00557 
<a name="l00558"></a>00558 <span class="keywordtype">void</span> QVPlot::advancePlot()
<a name="l00559"></a>00559     {
<a name="l00560"></a>00560     <span class="keywordflow">if</span> (!haveCurves)
<a name="l00561"></a>00561         {
<a name="l00562"></a>00562         std::cerr &lt;&lt; <span class="stringliteral">&quot;QVPlot internal error: early call to advancePlot.&quot;</span> &lt;&lt; std::endl;
<a name="l00563"></a>00563         <span class="keywordflow">return</span>;
<a name="l00564"></a>00564         }
<a name="l00565"></a>00565 
<a name="l00566"></a>00566     <span class="keywordflow">if</span> (activeBlocks &lt; 1)
<a name="l00567"></a>00567         <span class="keywordflow">return</span>;
<a name="l00568"></a>00568 
<a name="l00569"></a>00569     <span class="comment">// increments the values to scroll the window</span>
<a name="l00570"></a>00570     <span class="keywordflow">for</span> ( <span class="keywordtype">int</span> j = 0; j &lt; MAX_HISTORY; j++ ) timeData[j]++;
<a name="l00571"></a>00571 
<a name="l00572"></a>00572     <span class="keywordtype">double</span> max = 0;
<a name="l00573"></a>00573     <span class="keywordtype">double</span> brush[MAX_HISTORY]; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; MAX_HISTORY; i++) brush[i] = 0;
<a name="l00574"></a>00574 
<a name="l00575"></a>00575     <span class="comment">// for each curve</span>
<a name="l00576"></a>00576     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; linkCont.size(); i++)
<a name="l00577"></a>00577         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j &lt; linkCont[i].properties.size(); j++)
<a name="l00578"></a>00578             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> k = 0; k &lt; linkCont[i].properties[j].curves.size(); k++) {
<a name="l00579"></a>00579                  <span class="comment">// scroll the curve values</span>
<a name="l00580"></a>00580                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> l = 0; l &lt; MAX_HISTORY-1; l++)
<a name="l00581"></a>00581                     linkCont[i].properties[j].curves[k].history[l] = linkCont[i].properties[j].curves[k].history[l+1];
<a name="l00582"></a>00582 
<a name="l00583"></a>00583                 <span class="comment">// update the new value</span>
<a name="l00584"></a>00584                 <span class="keywordflow">if</span> (byTime)     linkCont[i].properties[j].curves[k].history[MAX_HISTORY-1] = linkCont[i].properties[j].curves[k].temp[0];
<a name="l00585"></a>00585                 <span class="keywordflow">else</span>            linkCont[i].properties[j].curves[k].history[MAX_HISTORY-1] = linkCont[i].properties[j].curves[k].temp[(iterationIndex%(linkCont.size()+1))];
<a name="l00586"></a>00586 
<a name="l00587"></a>00587                 <span class="comment">// if is visible, update the plot values</span>
<a name="l00588"></a>00588                 <span class="keywordflow">if</span> (linkCont[i].properties[j].curves[k].plot-&gt;style() != QwtPlotCurve::NoCurve) {
<a name="l00589"></a>00589                     <span class="keywordflow">if</span> (doBrush) { <span class="comment">// if is in brush mode, update the increment, sets the brush value, calculate the max value, and set the curve&#39;s plot</span>
<a name="l00590"></a>00590                         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> l = 0; l &lt; MAX_HISTORY; l++) {
<a name="l00591"></a>00591                             brush[l] += linkCont[i].properties[j].curves[k].history[l];
<a name="l00592"></a>00592                             linkCont[i].properties[j].curves[k].brushHistory[l] = brush[l];
<a name="l00593"></a>00593                             <span class="keywordflow">if</span> (max &lt; linkCont[i].properties[j].curves[k].brushHistory[l]) max = linkCont[i].properties[j].curves[k].brushHistory[l];
<a name="l00594"></a>00594                         }
<a name="l00595"></a>00595                         linkCont[i].properties[j].curves[k].plot-&gt;setRawData(timeData, linkCont[i].properties[j].curves[k].brushHistory, MAX_HISTORY);
<a name="l00596"></a>00596                     }
<a name="l00597"></a>00597                     <span class="keywordflow">else</span> { <span class="comment">// if isn&#39;t in brush mode, calculate the max value, and set the curve&#39;s plot</span>
<a name="l00598"></a>00598                         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> l = 0; l &lt; MAX_HISTORY; l++) {
<a name="l00599"></a>00599                             <span class="keywordflow">if</span> (max &lt; linkCont[i].properties[j].curves[k].history[l]) max = linkCont[i].properties[j].curves[k].history[l];
<a name="l00600"></a>00600                         }
<a name="l00601"></a>00601                         linkCont[i].properties[j].curves[k].plot-&gt;setRawData(timeData, linkCont[i].properties[j].curves[k].history, MAX_HISTORY);
<a name="l00602"></a>00602                     }
<a name="l00603"></a>00603                 }
<a name="l00604"></a>00604             }
<a name="l00605"></a>00605     max = 1.1 *max;
<a name="l00606"></a>00606 
<a name="l00607"></a>00607     setAxisScale(QwtPlot::yLeft, 0, max);
<a name="l00608"></a>00608     setAxisScale(QwtPlot::xBottom, timeData[MAX_HISTORY - 1], timeData[0]);
<a name="l00609"></a>00609 
<a name="l00610"></a>00610     <span class="comment">// and replot</span>
<a name="l00611"></a>00611     replot();
<a name="l00612"></a>00612     }
<a name="l00613"></a>00613 
<a name="l00614"></a>00614 
<a name="l00615"></a>00615 
<a name="l00616"></a>00616 
<a name="l00617"></a>00617 
<a name="l00618"></a>00618 
<a name="l00619"></a>00619 
<a name="l00620"></a>00620 
<a name="l00621"></a>00621 
<a name="l00622"></a>00622 
<a name="l00623"></a>00623 <span class="keywordtype">void</span> QVPlot::updateLegendItems()
<a name="l00624"></a>00624     {
<a name="l00625"></a>00625     <span class="keywordflow">if</span> (decorations)
<a name="l00626"></a>00626         <span class="keywordflow">foreach</span>(QWidget *widgetItem, legend()-&gt;legendItems())
<a name="l00627"></a>00627             {
<a name="l00628"></a>00628             QwtLegendItem *legendItem;
<a name="l00629"></a>00629             <span class="keywordflow">if</span>((legendItem = dynamic_cast&lt;QwtLegendItem*&gt;(widgetItem)) != NULL)
<a name="l00630"></a>00630                 QObject::connect(legendItem, SIGNAL(checked(<span class="keywordtype">bool</span>)), <span class="keyword">this</span>, SLOT(legendItemCheked(<span class="keywordtype">bool</span>)));
<a name="l00631"></a>00631             }
<a name="l00632"></a>00632     }
<a name="l00633"></a>00633 
<a name="l00634"></a>00634 <span class="keywordtype">void</span> QVPlot::legendItemCheked(<span class="keywordtype">bool</span>)
<a name="l00635"></a>00635     {
<a name="l00636"></a>00636     <span class="keywordflow">if</span> (decorations)
<a name="l00637"></a>00637         <span class="keywordflow">foreach</span>(QWidget *widgetItem, legend()-&gt;legendItems())
<a name="l00638"></a>00638             {
<a name="l00639"></a>00639             QwtLegendItem *legendItem;
<a name="l00640"></a>00640             <span class="keywordflow">if</span> ((legendItem = dynamic_cast&lt;QwtLegendItem*&gt;(widgetItem)) != NULL) {
<a name="l00641"></a>00641                 <span class="keywordflow">if</span> (legendItem-&gt;isChecked())
<a name="l00642"></a>00642                     hideStat(legendItem-&gt;text().text());
<a name="l00643"></a>00643                 <span class="keywordflow">else</span>
<a name="l00644"></a>00644                     showStat(legendItem-&gt;text().text());
<a name="l00645"></a>00645             }
<a name="l00646"></a>00646             }
<a name="l00647"></a>00647     }
<a name="l00648"></a>00648 
<a name="l00649"></a>00649 <span class="keywordtype">void</span> QVPlot::hideStat(<span class="keyword">const</span> QString labelText)
<a name="l00650"></a>00650     {
<a name="l00651"></a>00651     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; linkCont.size(); i++)
<a name="l00652"></a>00652         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j &lt; linkCont[i].properties.size(); j++)
<a name="l00653"></a>00653             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> k = 0; k &lt; linkCont[i].properties[j].curves.size(); k++)
<a name="l00654"></a>00654                 <span class="keywordflow">if</span> (linkCont[i].properties[j].curves[k].name == labelText) {
<a name="l00655"></a>00655                     linkCont[i].properties[j].curves[k].plot-&gt;setStyle(QwtPlotCurve::NoCurve);
<a name="l00656"></a>00656                     <span class="keywordflow">return</span>;
<a name="l00657"></a>00657                 }
<a name="l00658"></a>00658     }
<a name="l00659"></a>00659 
<a name="l00660"></a>00660 <span class="keywordtype">void</span> QVPlot::showStat(<span class="keyword">const</span> QString labelText)
<a name="l00661"></a>00661     {
<a name="l00662"></a>00662     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; linkCont.size(); i++)
<a name="l00663"></a>00663         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j = 0; j &lt; linkCont[i].properties.size(); j++)
<a name="l00664"></a>00664             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> k = 0; k &lt; linkCont[i].properties[j].curves.size(); k++)
<a name="l00665"></a>00665                 <span class="keywordflow">if</span> (linkCont[i].properties[j].curves[k].name == labelText)
<a name="l00666"></a>00666                     {
<a name="l00667"></a>00667                     linkCont[i].properties[j].curves[k].plot-&gt;setStyle(QwtPlotCurve::Lines);
<a name="l00668"></a>00668                     <span class="keywordflow">return</span>;
<a name="l00669"></a>00669                     }
<a name="l00670"></a>00670     }
</pre></div></div>
</td></tr></table>

<br /><hr><br />
<center><a href="http://perception.inf.um.es/QVision">QVision framework</a>.
<a href="http://perception.inf.um.es">PARP research group</a>.
Copyright &copy; 2007, 2008, 2009, 2010, 2011.</center>
<br />
</body>
</html>
